<?php
namespace Common\Model;
use Think\Model;

class SmsModel extends Model{
	public $autoCheckFields = false;
	public $tips_info       = '未知错误！';//提示信息
	/**
	 * 发送短信验证码
	 * @param  [type] $mobile 用户ID
	 * @param  [type] $type
	 */
	public function send_smscode($mobile, $type = ''){
		if(preg_match('/^1[34578][0-9]{9}$/', $mobile)==false){
			$this->tips_info = '对不起，手机号不正确！';
			return false;
		}

		//判断是否可以发送
		$mobile_exists = D('User')->mobile_exists($mobile);
		//忘记密码判断
		if($type == 'forget_password' && $mobile_exists == false){
			$this->tips_info = '手机号不存在！';
			return false;
		}
		//注册时判断是否注册过
		if($type == 'register' && $mobile_exists == true){
			$this->tips_info = '您的手机已经注册过，若忘记密码，请使用“找回密码”功能。';
			return false;
		}
		//更换手机号
		if($type == 'update_mobile' && $mobile_exists == true){
			$this->tips_info = '手机号已存在，不能更换！';
			return false;
		}
		
		//短信发送时间限制
		$sms_time   = S('API_SMSCODE_TIME'.$mobile);
		$sms_time   = $sms_time ? $sms_time : 0;
		$limit_time = 60;
		if((time() - $sms_time) <= $limit_time){
			$this->tips_info = '对不起，1分钟内不能重复获取短信验证码，请过后再试！';
			return false;
		}

		//判断发送次数，按天
		$sms_num  = S('API_SMSCODE_NUM_'.$mobile);
		$sms_num  = $sms_num ? $sms_num : 0;
		if($sms_num >= 10){
			$this->tips_info = '您发送短信次数过多！';
			return false;
		}

		//判断发送次数，30分钟内只能发送3条短信
		$sms_30time  = S('API_SMSCODE_30TIME'.$mobile);
		$sms_30time  = $sms_30time ? $sms_30time : 0;
		if((time() - $sms_30time) < 30 * 60 && $sms_num >= 3){
			$this->tips_info = '对不起，30分钟内只能发送3条短信，请过后再试！';
			return false;
		}

		//缓存验证码
		$smscode = S('API_SMSCODE_' . $mobile);
		//生成验证码
		$smscode = $smscode ? $smscode : \Org\Util\TPString::randString(6,1);
		//短信内容
		$smscode_tpl = Conf('smscode_tpl', 'sms');
		$smscode_tpl = str_replace(
			array('#code#', '#signature#'),
			array($smscode, Conf('signature','sms')),
			$smscode_tpl
		);
		$content = $smscode_tpl ? $smscode_tpl : '您的短信验证码为' . $smscode;

		//发送短信
		import("Sms", 'Public/Class/suncco/');
		$sms  = new \Sms();
		//设置验证码
		$sms->smscode = $smscode;
		$info = $sms->send($mobile, $content);
		if($info['status'] == 200){
			//缓存验证码10分钟
			S('API_SMSCODE_' . $mobile, $smscode, 600);
			//保存发送次数，保存半天
			S('API_SMSCODE_NUM_' . $mobile, $sms_num + 1, 12 * 60 * 60);
			//保存当前短信发送时间
			S('API_SMSCODE_TIME' . $mobile, time());
			//保存当前短信发送时间，每30分钟一次
			if(!$sms_30time){
				S('API_SMSCODE_30TIME' . $mobile, time(), 30 * 60);
			}
			return true;
		}else{
			$this->tips_info = '短信发送失败->' . $info['info'];
			return false;
		}
	}
	/**
	 * 检查验证码是否正确
	 * @param  string $mobile  手机号
	 * @param  string $smscode 验证码
	 */
	public function check_smscode($mobile = '', $smscode = ''){
		if(!$mobile || !$smscode){
			return false;
		}
		//验证码判断
		$cache_smscode = S('API_SMSCODE_'.$mobile);
		if($cache_smscode != $smscode){
			return true;
		}

		return false;
	}
	public function send($mobile, $content){
		// if(preg_match('/^1[34578][0-9]{9}$/', $mobile)==false){
		// 	$this->tips_info = '对不起，手机号不正确！';
		// 	return false;
		// }
		if(!$content){
			$this->tips_info = '内容不能为空！';
			return false;
		}
		$content = str_replace(
			array('#signature#'),
			array(Conf('signature', 'sms')),
			$content
		);
		//发送短信
		import("Sms", 'Public/Class/suncco/');
		$sms  = new \Sms();
		//设置验证码
		$sms->smscode = $smscode;
		$info = $sms->send($mobile, $content);
		if($info['status'] == 200){
			return true;
		}else{
			$this->tips_info = '短信发送失败->' . $info['info'];
			return false;
		}
	}
}
?>